Автор - Федоров А. Н.
Выводы промежуточных клеток удалены для краткости.
import sys
import pymol
_stdouterr = sys.stdout, sys.stderr
pymol.finish_launching(['pymol', '-q'])
sys.stdout, sys.stderr = _stdouterr
from pymol import cmd, movie
import time
from IPython.display import Image, HTML
def render(width=640, height=480, filename="/tmp/tmp.png", sleep=1):
cmd.ray(width, height)
cmd.png(filename)
time.sleep(sleep)
return filename
Оцените возможности Sculpting, в Wizard->Demo->Sculpting.
cmd.reinitialize()
cmd.fetch('1lmp')
Прикольная штука, особенно когда нужно пофиксить что-то в ручном режиме.
Используюя select within найдите водородные связи которыми белок связывает лиганд. Опишите эти возможные другие взаимодействия белка с лигандом. Попробуйте поискать альтернативный способ поиска водородных связей.
Для начала удалим молекулы раствора и вынесем лиганд в отдельную группу, добавим красивую раскраску-отображение-поворот.
cmd.remove('solvent')
cmd.show_as('lines', '1lmp')
cmd.select('ligand', 'het')
cmd.show('sticks', 'ligand')
cmd.reset()
cmd.center('ligand')
cmd.origin('ligand')
cmd.zoom('ligand', 4)
cmd.turn('x', 60)
cmd.turn('y', 30)
cmd.color('rutherfordium','ligand')
Image(render())
Теперь визуализируем водородные связи:
cmd.distance('hb', '1lmp', 'ligand', 3.2, mode=2)
cmd.select('active_site', '1lmp within 3.2 of ligand')
cmd.label('active_site and not ligand', 'resn, resi')
cmd.set('label_color', 'black', 'active_site')
cmd.set('label_color', 'black', 'hb')
Image(render())
В PyMol GUI так же есть инструмент для поиска водородных связей - find->polar contacts, но это не совсем то, что получается у нас.
Взаимодействия protein-ligand - это любые обратимые не ковалентные взимодействия.
Wikipedia
Non-covalent binding may depend on hydrogen bonds, hydrophobic forces, van der Waals forces, π-π interactions, electrostatic interactions in which no electrons are shared between the two or more involved molecules.
Средствами Tcl/Tk интерфейса Wizard->Mutagenesis проведите мутацию в белке, которая по вашему мнению должна привести к потере связывания с лигандом.
Для этого достаточно поменять только одну аминокислоту в сайте связывания. При этом должно выполниться одно из следующих условий:
Если покрутить модель в редакторе, то видно, что можно заменить 52 аспарагин на бОльшую аминокислоту, например, триптофан. Кроме того, такая замена не образует коллизий с исходным белком, только с лигандом.
Хотя, конечно, нужно подбирать аминокислоту хотя бы со схожими химическими свойствами, чтобы не нарушить исходную конформацию белка.
cmd.wizard("mutagenesis")
cmd.do("refresh_wizard")
cmd.get_wizard().do_select("resi 52")
cmd.get_wizard().set_mode("TRP")
cmd.do("refresh_wizard")
cmd.get_wizard().apply()
cmd.wizard(None)
cmd.reset()
cmd.colour('orange','resi 52')
cmd.show_as('sticks', 'resi 52')
cmd.center('ligand')
cmd.origin('ligand')
cmd.zoom('ligand', 1)
Image(render())
Используя команды mset, mview, super, translate создайте анимационный ролик mpeg где происходит совмещение белков и показывается место мутации. Обратите внимание на указания в object motions на http://www.pymolwiki.org pymolwiki.
cmd.delete('hb')
# Перезагрузим наш оригинальный wild type белок
cmd.fetch('1lmp', '1lmp_wt')
cmd.remove('solvent')
cmd.translate('[-35, 0, 0]', '1lmp_wt')
# Белки будем рисовать в cartoon mode
cmd.show_as('cartoon', '1lmp_wt or 1lmp')
# Выделим аминокислоты
cmd.color('blue', "1lmp_wt and resi 52")
cmd.color('red', "1lmp and resi 52")
cmd.show('sticks', '(1lmp_wt or 1lmp) and resi 52')
# Добавим подписи для красоты
# cmd.label('1lmp and name CA and resi 52', 'resn, resi')
# cmd.label('1lmp_wt and name CA and resi 52', 'resn, resi')
cmd.select('ligand_wt', '1lmp_wt and het')
cmd.show_as('sticks', 'ligand_wt or ligand')
cmd.color("rutherfordium", "ligand_wt or ligand")
cmd.zoom('all')
Image(render())
cmd.zoom('all')
cmd.mset('1 x 400')
cmd.frame('1')
cmd.mview('store')
cmd.mview('store', object="1lmp_wt")
cmd.frame('100')
cmd.do('translate [35, 0, 0], object=1lmp_wt')
cmd.zoom('1lmp')
cmd.mview('store')
cmd.mview('store', object="1lmp_wt")
cmd.frame('200')
cmd.center('1lmp and resi 52')
cmd.zoom('1lmp and resi 52', 3)
cmd.mview('store', object="1lmp_wt")
cmd.mview('store')
movie.add_roll(8.0, axis='y',start=200)
# Не нашел, как найти максимальный фреим, поэтому захардкодил
cmd.frame(439)
cmd.zoom('1lmp and resi 52', 3)
cmd.mview('store', object="1lmp_wt")
cmd.mview('store')
cmd.mview('reinterpolate')
!mkdir -p ./frames/
!rm ./frames/*
cmd.set('ray_trace_frames', '1')
cmd.set('ray_trace_mode', '1')
cmd.mpng('./frames/movie')
!ffmpeg -y -i './frames/movie%04d.png' -c:v libx264 -pix_fmt yuv420p -vf "crop=trunc(iw/2)*2:trunc(ih/2)*2" movie.mp4 > /dev/null
!rm ./frames/*
import base64
with open("movie.mp4", 'rb') as file:
video = base64.b64encode(file.read()).decode()
video = '<video controls alt="test" src="data:video/mp4;base64,{}">'.format(str(video))
HTML(data=video)
Приседените флуорусцентную метку TAMRA к белку через сложноэфирную связь. Используйте команды fuse и torsion.
Сложноэфирная связь: $\require{mhchem}\ce{R_1-COOH + HO-R_2 <=>[H+] R_1-COO-R_2 + H2O}$.
В нашем случае метка TAMRA - это $\require{mhchem}\ce{R_1-COOH}$, а одна из подходящих аминокислот выступает в роли $\require{mhchem}\ce{HO-R_2}$. В качестве такой аминокислоты может выступить, например, 122 серин.
Метку TAMRA загрузим из pubchem, а торсионный угол подберем на глаз, чтобы избежать коллизий с самим белком.
!wget -O './6-TAMRA.sdf' 'https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/CID/2762604/record/SDF/?record_type=2d&response_type=save&response_basename=Structure2D_CID_2762604'
cmd.reset()
cmd.reinitialize()
cmd.fetch("1lmp")
cmd.load("6-TAMRA.sdf")
cmd.remove("solvent")
cmd.select("link-tamra", "name O in 6-TAMRA within 1 of name H in 6-TAMRA")
cmd.select("link-serine", "SER`122/CB")
cmd.fuse("link-tamra", "link-serine")
cmd.torsion(160)
cmd.select("sele", "1lmp///`118-140/")
cmd.show_as("sticks", "sele")
cmd.orient("sele")
cmd.rotate("x", 180)
cmd.rotate("z", 80)
cmd.rotate("y", -50)
Image(render())
Напишите скрипт для построения поли-аланиновой ( Вы вольны использовать любую аминоксилоту) альфа спирали длинной 100 аминкислот. Псевдо-код вы можете найти в подсказках.
cmd.reinitialize()
# Wikipedia:
# Residues in α-helices typically adopt backbone (φ, ψ) dihedral angles around (−60°, −45°)
PHI, PSI = -60, -45
N = 100
AA = 'ala'
# Добавляем аминокислоты в редактор
cmd.fragment(AA)
for i in range(2, N + 1):
cmd.edit(f'resi {i} and name C')
cmd.editor.attach_amino_acid("pk1", AA)
# Выставляем торсионные углы
for i in range(2, N + 1):
cmd.set_dihedral(f"resi {i} & name N", f"resi {i} & name CA",
f"resi {i} & name C", f"resi {i+1} & name N", PHI)
cmd.set_dihedral(f"resi {i} & name C", f"resi {i+1} & name N",
f"resi {i+1} & name CA", f"resi {i} & name C", PSI)
cmd.zoom('all')
Image(render())
cmd.orient()
cmd.zoom(AA, -80)
cmd.rotate('z', 90, object=AA)
cmd.rotate('x', 90, object=AA)
Image(render())
!jupyter nbconvert hw2.ipynb --to html